home *** CD-ROM | disk | FTP | other *** search
/ Nibble Magazine / nib19b.dsk / HIDDEN LINES.bas < prev    next >
BASIC Source File  |  2023-02-26  |  6KB  |  162 lines

  1. 10  REM  **********************
  2. 20  REM  *    HIDDEN LINES    *
  3. 30  REM  * BY R.B. GOLDSTEIN  *
  4. 40  REM  * COPYRIGHT (C) 1984 *
  5. 50  REM  * BY MICROSPARC, INC *
  6. 60  REM  * LINCOLN, MA. 01773 *
  7. 70  REM  **********************
  8. 80 D$ =  CHR$(4): ONERR  GOTO 1600
  9. 90 MX = 1E6:MN =  -MX:U = 1:Z = 0:EPS = 1E -3:T$ = "THINKING"
  10. 100  DIM U(150),V(150),W(150),E%(150,4),F%(50,1),FP%(150)
  11. 110  DIM EU(50,1),EV(50,1),EW(50,1),S(18,1),T(18,1),V%(50),X(150),Y(150),Z(150)
  12. 120  REM  * READ FILE *
  13. 130  TEXT : HOME : VTAB 20: PRINT "** COPYRIGHT 1984 BY MICROSPARC, INC. **": VTAB 2: INPUT "FILE NAME:";F$
  14. 140  PRINT D$"VERIFY"F$: PRINT D$"OPEN"F$: PRINT D$"READ"F$
  15. 150  INPUT NP,NE,NF
  16. 160  FOR I = U TO NP: INPUT X(I),Y(I),Z(I): NEXT 
  17. 170 F%(U,U) = U: FOR I = U TO NF: INPUT N:F%(I,Z) = N:F%(I +U,U) = F%(I,U) +N:I1 = F%(I,U):I2 = I1 +N -U
  18. 180  FOR J = I1 TO I2: INPUT FP%(J): NEXT : NEXT 
  19. 190  FOR I = U TO NE: INPUT E%(I,1),E%(I,2),E%(I,3),E%(I,4): NEXT 
  20. 200  PRINT D$"CLOSE"F$
  21. 210  REM  * VIEWPOINT *
  22. 220  PRINT "LINE OF SIGHT:": INPUT "XE,YE,ZE=";XE,YE,ZE
  23. 230 Q1 = XE *XE +YE *YE:Q2 =  SQR(Q1):Q3 =  SQR(Q1 +ZE *ZE):Q4 = 1/(Q2 *Q3)
  24. 240  INPUT "K=";K
  25. 250 UL = MX:UH = MN:VL = MX:VH = MN
  26. 260  REM  *COMPUTE TRANSFORMATION *
  27. 270  FOR I = U TO NP
  28. 280 A = X(I):B = Y(I):C = Z(I)
  29. 290 W(I) =  -(XE *A +YE *B +ZE *C)
  30. 300 T = (U -K)/(U +W(I)/(Q3 *Q3))
  31. 310 U(I) = T *(XE *B -YE *A)/Q2
  32. 320 V(I) = T *(Q1 *C -(A *XE +B *YE) *ZE) *Q4
  33. 330 W(I) = T *W(I)
  34. 340  IF U(I) <UL  THEN UL = U(I)
  35. 350  IF U(I) >UH  THEN UH = U(I)
  36. 360  IF V(I) <VL  THEN VL = V(I)
  37. 370  IF V(I) >VH  THEN VH = V(I)
  38. 380  NEXT 
  39. 390  REM  * SCALE PICTURE *
  40. 400 DU = 279/(UH -UL):DV = 191/(VH -VL): PRINT T$
  41. 410 D = DU: IF DV <D  THEN D = DV
  42. 420  FOR I = U TO NP
  43. 430 U(I) = D *(U(I) -UL)
  44. 440 V(I) = D *(VH -V(I))
  45. 450 W(I) = D *W(I)
  46. 460  NEXT 
  47. 470  REM  * COMPUTE NORMAL VECTOR *
  48. 480  PRINT T$: FOR I = U TO NF
  49. 490 I1 = F%(I,U):I2 = I1 +N -U
  50. 500 P1 = FP%(I1):P2 = FP%(I1 +U):P3 = FP%(I1 +U +U)
  51. 510 D = (U(P3) -U(P2)) *(V(P2) -V(P1)) -(U(P2) -U(P1)) *(V(P3) -V(P2))
  52. 520  REM  * TEST VISIBILITY OF FACE *
  53. 530 V%(I) = U: IF D > -EPS  THEN V%(I) = Z: GOTO 670
  54. 540 EU(I,Z) = U(P1):EU(I,U) = U(P1)
  55. 550 EV(I,Z) = V(P1):EV(I,U) = V(P1)
  56. 560 EW(I,Z) = W(P1):EW(I,U) = W(P1)
  57. 570  REM  * COMPUTE EXTENTS *
  58. 580  FOR K = I1 +U TO I2
  59. 590 J = FP%(K)
  60. 600  IF U(J) <EU(I,Z)  THEN EU(I,Z) = U(J): GOTO 620
  61. 610  IF U(J) >EU(I,U)  THEN EU(I,U) = U(J)
  62. 620  IF V(J) <EV(I,Z)  THEN EV(I,Z) = V(J): GOTO 640
  63. 630  IF V(J) >EV(I,U)  THEN EV(I,U) = V(J)
  64. 640  IF W(J) <EW(I,Z)  THEN EW(I,Z) = W(J): GOTO 660
  65. 650  IF W(J) >EW(I,U)  THEN EW(I,U) = W(J)
  66. 660  NEXT 
  67. 670  NEXT 
  68. 680  REM  * INITIALLY ALL SEGMENTS ARE VISIBLE *
  69. 690  FOR I = U TO NE:E%(I,Z) = U: NEXT 
  70. 700  REM  * SET GRAPHICS MODE *
  71. 710  REM  * FOR EACH SEGMENT #I *
  72. 720  HGR2 : HCOLOR= 3
  73. 730  FOR I = U TO NE
  74. 740  IF E%(I,Z) = Z  THEN 1550
  75. 750 F1 = E%(I,3):F2 = E%(I,4)
  76. 760  IF F2 = Z  THEN 790
  77. 770  REM  * TEST FOR VISIBILITY *
  78. 780  IF V%(F1) = Z  AND V%(F2) = Z  THEN 1550
  79. 790 NS = 1:SL = Z:SH = U:S(U,Z) = SL:S(U,U) = SH
  80. 800 P1 = E%(I,U):P2 = E%(I,U +U):U1 = U(P1):V1 = V(P1):W1 = W(P1):U2 = U(P2):V2 = V(P2):W2 = W(P2):A1 = U2 -U1:A4 = V2 -V1
  81. 810  REM  * FIND MAX. & MIN. IN EACH COORD. ON SEGMENT *
  82. 820  IF U1 <U2  THEN UL = U1:UH = U2: GOTO 840
  83. 830 UL = U2:UH = U1
  84. 840  IF V1 <V2  THEN VL = V1:VH = V2: GOTO 860
  85. 850 VL = V2:VH = V1
  86. 860  IF W1 <W2  THEN WL = W1:WH = W2: GOTO 890
  87. 870 WL = W2:WH = W1
  88. 880  REM  * FOR EACH FACE #J *
  89. 890  FOR J = U TO NF
  90. 900  REM  * AVOID INVISIBLE FACES *
  91. 910  IF V%(J) = Z  THEN 1430
  92. 920  REM  * AVOID BOUNDING FACES *
  93. 930  IF F1 = J  OR F2 = J  THEN 1430
  94. 940  REM  * TEST AGAINST EXTENTS *
  95. 950  IF WH -EW(J,Z) <EPS  THEN 1430
  96. 960  IF UH -EU(J,Z) <EPS  THEN 1430
  97. 970  IF EU(J,U) -UL <EPS  THEN 1430
  98. 980  IF VH -EV(J,Z) <EPS  THEN 1430
  99. 990  IF EV(J,U) -VL <EPS  THEN 1430
  100. 1000  REM  * INTERSECTION TESTS MUST BE MADE *
  101. 1010 S1 = MX:S2 = MN:N = F%(J,Z):NN = F%(J,U):D1 = Z:D2 = Z
  102. 1020  FOR K = U TO N
  103. 1030 R1 = FP%(NN +K -U):R2 = FP%(NN +K)
  104. 1040  IF K = N  THEN R2 = FP%(NN)
  105. 1050 A2 = U(R1) -U(R2):A3 = U(R1) -U1
  106. 1060 A5 = V(R1) -V(R2):A6 = V(R1) -V1
  107. 1070 DT = A1 *A5 -A2 *A4
  108. 1080  IF DT <EPS  AND DT > -EPS  THEN 1150
  109. 1090 S = (A3 *A5 -A2 *A6)/DT
  110. 1100 E = (A1 *A6 -A3 *A4)/DT
  111. 1110  IF E < -EPS  OR E >U +EPS  THEN 1150
  112. 1120 D = (W(R1) +(W(R2) -W(R1)) *E) -(W1 +(W2 -W1) *S)
  113. 1130  IF S <S1  THEN D1 = D:S1 = S
  114. 1140  IF S >S2  THEN D2 = D:S2 = S
  115. 1150  NEXT 
  116. 1160  REM  * IS FACE IN EDGE TO VIEWER? *
  117. 1170  IF  ABS(S1 -S2) <EPS  THEN 1430
  118. 1180 SJ = S1:DJ = D1: IF SJ <Z  THEN SJ = Z:T = S1/(S1 -S2):DJ = D1 +T *(D2 -D1)
  119. 1190 SK = S2:DK = D2: IF SK >U  THEN SK = U:T = (S1 -U)/(S1 -S2):DK = D1 +T *(D2 -D1)
  120. 1200  REM  * IS THIS SEGMENT OBSCURED? *
  121. 1210  IF DJ > =  -EPS  AND DK > =  -EPS  THEN 1430
  122. 1220  IF SJ <SL +EPS  AND SK >SH -EPS  THEN E%(I,Z) = Z:J = NF: GOTO 1430
  123. 1230  REM  * IS THERE AN INTERSECTION OF SEGMENT & FACE? *
  124. 1240  IF SK <EPS  OR SJ >U -EPS  THEN 1430
  125. 1250  REM  * CHECK LISTS OF FRAGMENTS AGAINST SJ,SK *
  126. 1260 C = Z: FOR K = U TO NS
  127. 1270 S1 = S(K,Z):S2 = S(K,U)
  128. 1280  IF SJ <S1 +EPS  THEN 1350
  129. 1290  IF SJ >S2 -EPS  THEN 1340
  130. 1300  IF SK >S2 -EPS  THEN 1330
  131. 1310 C = C +U:T(C,Z) = S1:T(C,U) = SJ
  132. 1320 C = C +U:T(C,Z) = SK:T(C,U) = S2: GOTO 1380
  133. 1330 C = C +U:T(C,Z) = S1:T(C,U) = SJ: GOTO 1380
  134. 1340 C = C +U:T(C,Z) = S1:T(C,U) = S2: GOTO 1380
  135. 1350  IF SK <S1 +EPS  THEN 1340
  136. 1360  IF SK >S2 -EPS  THEN 1380
  137. 1370 C = C +U:T(C,Z) = SK:T(C,U) = S2
  138. 1380  NEXT 
  139. 1390  IF C = Z  THEN J = NF:E%(I,Z) = Z: GOTO 1430
  140. 1400 NS = C:SL = T(U,Z):SH = T(C,U): FOR K = U TO NS
  141. 1410 S(K,Z) = T(K,Z):S(K,U) = T(K,U)
  142. 1420  NEXT 
  143. 1430  NEXT 
  144. 1440  REM  * SKIP INVISIBLE SEGMENTS *
  145. 1450  IF E%(I,Z) = Z  THEN 1550
  146. 1460  REM  * FOR EACH VISIBLE SEGMENT HPLOT FRAGMENTS *
  147. 1470  FOR K = U TO NS
  148. 1480 S1 = S(K,Z):S2 = S(K,U):T1 = U -S1:T2 = U -S2
  149. 1490 LU = U1 *T1 +U2 *S1
  150. 1500 RU = U1 *T2 +U2 *S2
  151. 1510 LV = V1 *T1 +V2 *S1
  152. 1520 RV = V1 *T2 +V2 *S2
  153. 1530  HPLOT LU,LV TO RU,RV
  154. 1540  NEXT 
  155. 1550  NEXT 
  156. 1560  REM  * ALLOW USER TO TYPE 'Y' FOR A NEW VIEW *
  157. 1570  PRINT  CHR$(7): GET A$: IF A$ = "Y"  THEN  TEXT : GOTO 220
  158. 1580  PRINT : TEXT : END 
  159. 1590  REM  * SIMPLE ERROR ROUTINE *
  160. 1600  PRINT D$"CLOSE"F$
  161. 1610  PRINT "LINE NUMBER:"; PEEK(219) *256 + PEEK(218)
  162. 1620  PRINT "ERROR NUMBER:"; PEEK(222): TEXT